package com.linyaonan.leetcode.medium._2730;

/**
 *
 * 给你一个下标从 0 开始的字符串 s ，这个字符串只包含 0 到 9 的数字字符。
 *
 * 如果一个字符串 t 中至多有一对相邻字符是相等的，那么称这个字符串 t 是 半重复的 。例如，"0010" 、"002020" 、"0123" 、"2002" 和 "54944" 是半重复字符串，而 "00101022" （相邻的相同数字对是 00 和 22）和 "1101234883" （相邻的相同数字对是 11 和 88）不是半重复字符串。
 *
 * 请你返回 s 中最长 半重复
 * 子字符串
 *  的长度。
 *
 *
 *
 * 示例 1：
 *
 * 输入：s = "52233"
 *
 * 输出：4
 *
 * 解释：
 *
 * 最长的半重复子字符串是 "5223"。整个字符串 "52233" 有两个相邻的相同数字对 22 和 33，但最多只能选取一个。
 *
 * 示例 2：
 *
 * 输入：s = "5494"
 *
 * 输出：4
 *
 * 解释：
 *
 * s 是一个半重复字符串。
 *
 * 示例 3：
 *
 * 输入：s = "1111111"
 *
 * 输出：2
 *
 * 解释：
 *
 * 最长的半重复子字符串是 "11"。子字符串 "111" 有两个相邻的相同数字对，但最多允许选取一个。
 *
 *
 *
 * 提示：
 *
 * 1 <= s.length <= 50
 * '0' <= s[i] <= '9'
 *
 * @author: Lin
 * @date: 2024/10/28
 */
public class FindTheLongestSemiRepetitiveSubstring {

    public int longestSemiRepetitiveSubstring(String s) {
        // 1. 特殊边界
        if (s.length() <= 2) {
            return s.length();
        }
        // 2. 不定长滑动窗口
        // 3,3,3,1,2,1,1,2,3,3,4,13,5,4,5,2,4,6,5,6,6,6,6
        int l = 0;
        int r = 1;
        int result = 0;
        boolean hashTwo = false;
        while (l <= r && r < s.length()) {
            char last = s.charAt(r - 1);
            char c = s.charAt(r);
            // 当前字符与前一个一致
            if (last == c) {
                // 之前已经有一致的
                if (hashTwo) {
                    // 需要找到第一个出现连续的位置
                    while (s.charAt(l) != s.charAt(l + 1)) {
                        l++;
                    }
                    l++;
                } else {
                    hashTwo = true;
                }
            }
            result = Math.max(result, r - l + 1);
            r++;
        }

        return result;

    }

}
